package com.buba.service.impl;

import com.buba.mapper.UserMapper;
import com.buba.service.UserService;
import com.buba.utils.ConstantSmsUtils;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.*;
import entity.File;
import entity.User;
import entity.VO.UserVO;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import result.CommonResult;
import result.R;
import utils.PasswordManagerUtil;
import utils.RandomUtil;
import utils.TokenUtil;

import java.util.concurrent.TimeUnit;

/**
 * @创建人: 胡亮
 * @创建时间: 2022年11月22日 上午 11:31
 * @描述:用户操作ServiceImpl层
 */
@Service
@Log4j2
public class UserServiceImpl implements UserService {


    @Autowired
    UserMapper userMapper;

    @Autowired
    RedisTemplate redisTemplate;

    @Autowired
    RedisTemplate redisTemplates;

//    @Resource
//    RedisUtil redisUtil;
    /**
     *
     * @author: HKY
     * @date: 2022/11/21 20:45
     * @Description: 用户根据手机号和MD5加密密码进行登录
     */
    @Override
    public CommonResult selectByPrimaryKey(User record) {
        //密码MD5加密
        record.setPassWord(PasswordManagerUtil.getMd5DigestAsHex(record.getPassWord()));
        User user = userMapper.selectByPrimaryKey(record);
        if (user != null){
            //生成token
            String token = TokenUtil.createToken(user);
//            redisUtil.set(token,user,60 * 60 * 12);
            redisTemplate.opsForValue().set(token,user,12, TimeUnit.HOURS);
            return CommonResult.ok().data("token",token).data("administrator",user);
        }else {
            return CommonResult.fail("id为空");
        }

    }

    /**
     *
     * @author: HKY
     * @date: 2022/11/22 10:23
     * @return int
     * @Description: 用户注册并登录
     */
    @Override
    public CommonResult insert(UserVO userVO) {
        String o=(String)redisTemplates.opsForValue().get(userVO.getUserPhone());
        if (o == null){
            return CommonResult.fail("验证码错误");
        } else if (Integer.parseInt(o)!= userVO.getVerificationCode()) {
            return CommonResult.fail("验证码错误");
        }
        User user = new User();
        BeanUtils.copyProperties(userVO,user);
        user.setPassWord(PasswordManagerUtil.getMd5DigestAsHex(userVO.getPassWord()));
        boolean flag = (userMapper.insert(user)>0);
        if (flag){
            //生成token
            String token = TokenUtil.createToken(user);
            redisTemplate.opsForValue().set(token,user,12, TimeUnit.HOURS);
            return CommonResult.ok().data("token",token).data("administrator",user);

        }else {
            return CommonResult.fail("验证码错误");
        }
    }

    /**
     *
     * @author: HKY
     * @date: 2022/11/23 13:51
     * @param phone
     * @return boolean
     * @Description: 发送手机验证码
     */
    @Override
    public boolean sendMobilePhoneVerificationCode(String phone) {
        try{
            // 实例化一个认证对象，入参需要传入腾讯云账户secretId，secretKey,此处还需注意密钥对的保密
            // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
            Credential cred = new Credential(ConstantSmsUtils.SECRET_ID, ConstantSmsUtils.SECRET_KEY);
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("sms.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            SendSmsRequest req = new SendSmsRequest();
            String[] phoneNumberSet1 = {"+86"+phone};//发送的手机号
            req.setPhoneNumberSet(phoneNumberSet1);

            req.setSmsSdkAppId(ConstantSmsUtils.SMSSDKAPP_ID);// 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId
            req.setSignName(ConstantSmsUtils.SIGN_NAME);//短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名
            req.setTemplateId(ConstantSmsUtils.TEMPLATE_ID);//模板 ID: 必须填写已审核通过的模板 ID

            //生成6位数随机验证码
            String verificationCode = RandomUtil.getSixBitRandom();
            String[] templateParamSet1 = {verificationCode, "1"};
            req.setTemplateParamSet(templateParamSet1);

            // 返回的resp是一个SendSmsResponse的实例，与请求对象对应
            SendSmsResponse resp = client.SendSms(req);
            log.info("resp"+resp);
            // 输出json格式的字符串回包
            log.info(SendSmsResponse.toJsonString(resp));
            //将验证码放在Redis中
            redisTemplates.opsForValue().set(phone,verificationCode,1, TimeUnit.MINUTES);
            return true;
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
            return false;
        }
    }

    /**
     *
     * @创建人: 胡亮
     * @创建时间: 2023/03/06 下午 08:19
     * @参数1 userId
     * @返回值 entity.User
     * @描述: 获取当前登录用户信息
     */
    @Override
    public User selectById(Integer userId) {
        return userMapper.selectById(userId);
    }

    /**
     *
     * @创建人: 胡亮
     * @创建时间: 2023/03/06 下午 08:53
     * @参数1 user
     * @返回值 int
     * @描述: 修改个人资料
     */
    @Override
    public int update(User user) {
        return userMapper.update(user);
    }


}